﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;

namespace Biosek
{

	public static class ARFFHelper
	{
		/// <summary>
		/// Almacena un archivo ARFF numerico, usando como clase el primer elemento de cada secuencia
		/// </summary>
		/// <typeparam name="T">Tipo de dato usado, debe ser un tipo entero</typeparam>
		/// <param name="filename">Archivo a ser guardado</param>
		/// <param name="data">Secuencias</param>
		public static void SavePlain<T>(string filename, IEnumerable<IEnumerable<T>> data) where T : struct
		{
			using (var sb = new StreamWriter(filename))
			{
				sb.WriteLine("@RELATION cleavageSite_chainPairs");

				// Obtiene las clases. Siempre son el primer elemento de cada linea
				var classes = data.Select(x => x.First()).Distinct();
				var classesString = classes.Select(x => Convert.ChangeType(x, TypeCode.Int32).ToString());
				var classesString2 = string.Join(",", classesString);
				sb.WriteLine("@ATTRIBUTE class {{{0}}}", classesString2);

				// Obtiene los atributos de la secuencia
				var mp = data.Select(x => x.Skip(1).Count()).Max();
				for (int i = 0; i < mp; i++)
				{
					sb.WriteLine("@ATTRIBUTE c{0} NUMERIC", i);
				}

				// Escribe los datos
				sb.WriteLine("@DATA");
				var allStr = data.Select(x => x.Select(y => Convert.ChangeType(y, TypeCode.Int32).ToString()));
				var lines = allStr.Select(x => string.Join(",", x));
				foreach (var line in lines)
				{
					sb.WriteLine(line);
				}
			}
		}
	}
}